package com.c.cojbackendquestionservice.manager;

import com.c.cojbackendcommon.common.ErrorCode;
import com.c.cojbackendcommon.exception.BusinessException;
import com.c.cojbackendmodel.model.vo.AiQuestionVO;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.lkeap.v20240522.LkeapClient;
import com.tencentcloudapi.lkeap.v20240522.models.ChatCompletionsRequest;
import com.tencentcloudapi.lkeap.v20240522.models.ChatCompletionsResponse;
import com.tencentcloudapi.lkeap.v20240522.models.Message;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 用于对接 AI 平台
 */
@Service
@Slf4j
public class AiManager {

    private final String DEFAULT_MODEL = "deepseek-v3";

    // 使用腾讯云对接 DeepSeek AI
    @Resource
    private LkeapClient deepSeekClient;

    public static final String PRECONDITION = "现在你是一位精通OJ竞赛题目的算法专家，接下来我会按照以下固定格式给你发送内容：\n" +
            "题目标题：\n" +
            "{该算法题的标题}\n" +
            "题目内容:\n" +
            "{该算法题的具体内容}\n" +
            "题目使用语言:\n" +
            "{解决该题目所使用的编程语言}\n" +
            "请认真根据这两部分内容，必须严格按照以下指定格式生成markdown内容（此外不要输出任何多余的开头、结尾、注释）\n" +
            "【【【【【\n" +
            "明确的代码分析，越详细越好，不要生成多余的注释\n" +
            "【【【【【\n" +
            "解答该题目对应的代码，代码相关参数是通过命令行传来的且写在main方法中，只需生成要求编程语言的代码\n";


    /**
     * 调用 AI 接口，获取响应字符串
     * 只要用户信息，在前端没有输入的情况下
     *
     * @param userPrompt
     * @return
     */
    public String doChat(String userPrompt) {
        return doChat("", userPrompt, DEFAULT_MODEL);
    }

    /**
     * 调用 AI 接口，获取响应字符串
     * 有系统预设以及用户信息
     *
     * @param systemPrompt
     * @param userPrompt
     * @return
     */
    public String doChat(String systemPrompt, String userPrompt) {
        return doChat(systemPrompt, userPrompt, DEFAULT_MODEL);
    }

    /**
     * 调用 AI 接口，获取响应字符串
     *
     * @param systemPrompt
     * @param userPrompt
     * @param model
     * @return
     */
    public String doChat(String systemPrompt, String userPrompt, String model) {
        // 构造消息列表
        try {
            // 实例化一个请求对象,每个接口都会对应一个request对象
            ChatCompletionsRequest req = new ChatCompletionsRequest();
            req.setModel(DEFAULT_MODEL);
            req.setStream(false);
            // 用户消息
            Message[] messages = new Message[2];
            Message message1 = new Message();
            message1.setRole("user");
            message1.setContent(userPrompt);
            messages[1] = message1;
            //系统消息
            Message message0 = new Message();
            message0.setRole("system");
            message0.setContent(systemPrompt);
            messages[0] = message0;
            //将信息配置到rep中
            req.setMessages(messages);
            // 返回的resp是一个ChatCompletionsResponse的实例，与请求对象对应
            ChatCompletionsResponse resp = deepSeekClient.ChatCompletions(req);
            //输入用例（用户信息和系统信息）
            String content = resp.getChoices()[0].getMessage().getContent();
            return content;
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 调用失败，没有返回结果");
        }

    }


    /**
     * 获取 AI 生成结果
     *
     * @param
     * @param title
     * @param content
     * @return
     */
    public AiQuestionVO getGenResultByDeepSeek(final String title, final String content, final String language, final Long questionId) {
        String promote = AiManager.PRECONDITION + "标题 " + title + " \n内容: " + content + "\n编程语言: " + language;
        String resultData = doChat(promote);
        log.info("AI 生成的信息: {}", resultData);
        String genResult = null;
        String genCode = resultData;
        if (resultData.split("【【【【【").length >= 3) {
            genResult = resultData.split("【【【【【")[1].trim();
            genCode = resultData.split("【【【【【")[2].trim();
        }
        return new AiQuestionVO(genResult, genCode, questionId);
    }

}

